const sharp = require('sharp');
const imagemin = require('imagemin');
const imageminPngquant = require('imagemin-pngquant');
const imageminJpegtran = require('imagemin-jpegtran');

/**
 * 压缩图片的中间件函数
 */
async function compressImage(ctx, next) {
  // 判断请求是否是图片文件
  if (/^image\/.+/.test(ctx.response.type)) {
    // 读取图片
    const image = sharp(await ctx.body);
    // 压缩图片
    image.resize({ width: 800 })
      .jpeg({ quality: 80 })
      .png({ compressionLevel: 8, adaptiveFiltering: false })
      .toBuffer()
      .then(async (data) => {
        // 用imagemin再次压缩图片
        const compressedData = await imagemin.buffer(data, {
          plugins: [
            imageminPngquant(),
            imageminJpegtran(),
          ],
        });
        // 设置响应头
        ctx.set('Content-Length', compressedData.length);
        // 返回压缩后的图片
        ctx.body = compressedData;
      });
  } else {
    await next();
  }
}

module.exports = compressImage
